package main

import "fmt"

type A interface{
// 空接口 任何类型都实现了空接口 没有任何约束
// 空接口也可以直接当作类型来使用，可以表示任意类型
}

func show (a interface{}) { // 表示函数的任意类型
	fmt.Printf("值: %v 类型: %T\n", a, a)
}

func main() {
	var a1 A
	var str = "hello world" 
	a1 = str  // 让字符串实现这个A接口
	fmt.Printf("值: %v 类型: %T\n", a1, a1)

	var b interface{}
	b = true
	fmt.Printf("值: %v 类型: %T\n", b, b)

	show(20)
	show("good")

	// var m1 = make(map[string]string)
	// m1["age"] = "20"
	// fmt.Println(m1)

	var m1 = make(map[string]interface{})
	m1["age"] = "20"
	fmt.Println(m1)

	var s1 = []interface{}{1, "hello", true}
	fmt.Println(s1)

	var a interface{}
	a = "hello"
	v, ok := a.(string)
	if ok {
		fmt.Println("a就是一个string类型",v)
	} else {
		fmt.Println("类型断言失败")	
	}

	MyPrint(10)
}

// 定义一个方法，可以传入任意类型的数据类型，然后根据不同的类型实现不同的功能
func MyPrint(x interface{}) {
	switch x.(type) {
	case int:
		fmt.Println("int类型", x)
	case string:
		fmt.Println("string类型", x)
	case bool:
		fmt.Println("bool类型", x)
	default:
		fmt.Println("其他类型", x)
	}
}